import fitz  # PyMuPDF库
from PIL import Image
import io
'''
    必要库
    pip install pymupdf pillow
'''

def pdf_to_long_image(pdf_path, output_path, zoom=2.0):
    """
    将PDF文件转换为单张长图

    参数:
    pdf_path (str): PDF文件路径
    output_path (str): 输出图片路径（需以.jpg或.png结尾）
    zoom (float): 缩放比例，值越大图片越清晰，但文件也越大
    """
    # 打开PDF文件
    pdf_document = fitz.open(pdf_path)

    # 存储每一页的图片对象
    page_images = []

    # 遍历PDF的每一页
    for page_num in range(len(pdf_document)):
        # 获取页面
        page = pdf_document.load_page(page_num)

        # 设置缩放
        matrix = fitz.Matrix(zoom, zoom)
        pix = page.get_pixmap(matrix=matrix)

        # 将pixmap转换为PIL Image对象
        img_data = pix.tobytes("png")
        img = Image.open(io.BytesIO(img_data))
        page_images.append(img)

        print(f"已处理第 {page_num + 1} 页")

    # 计算长图的总宽度和高度
    if not page_images:
        print("没有找到PDF页面")
        return

    # 假设所有页面宽度相同，取第一页的宽度
    width = page_images[0].width
    # 总高度是所有页面高度之和
    height = sum(img.height for img in page_images)

    # 创建空白长图
    long_image = Image.new('RGB', (width, height))

    # 拼接图片
    current_height = 0
    for img in page_images:
        long_image.paste(img, (0, current_height))
        current_height += img.height
        print(f"已拼接 {page_images.index(img) + 1}/{len(page_images)} 页")

    # 保存长图
    long_image.save(output_path)
    print(f"长图已保存至: {output_path}")

    # 关闭PDF
    pdf_document.close()


if __name__ == "__main__":
    # 示例用法
    pdf_file = "test.pdf"  # 替换为你的PDF文件路径
    output_file = "output.jpg"  # 输出图片路径

    # 转换PDF为长图，zoom值可根据需要调整
    pdf_to_long_image(pdf_file, output_file, zoom=2.0)
